package com.atguigu.realtime.util;

import com.atguigu.realtime.bean.OrderInfo;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author lizhenchao@atguigu.cn
 * @Date 2022/2/11 11:08
 */
public class JdbcUtil {
    public static Connection getConnection(String driver, String url) throws ClassNotFoundException, SQLException {
        // 1. 加载驱动
        Class.forName(driver);
        return DriverManager.getConnection(url);
    }
    
    public static <T> List<T> queryList(Connection conn,
                                        String sql,
                                        Object[] args,
                                        Class<T> tClass) throws SQLException, IllegalAccessException, InstantiationException, InvocationTargetException {  // 通过反射的方式去创建对象
        ArrayList<T> result = new ArrayList<>();
        
        PreparedStatement ps = conn.prepareStatement(sql);
        // sql语句中可能有占位符, 给占位符进行赋值
        for (int i = 0; args != null && i < args.length; i++) {
            ps.setObject(i + 1, args[i]);
        }
        // 执行查询, 返回值就是查询到的结果. 可能是多行, 每行数据封装到一个T类型的对象中
        ResultSet resultSet = ps.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        while (resultSet.next()) {
            // 循环一次, 获取一行数据
            // 每行的每一列都要那出来, 每行有多少列?
            // 一行数据封装到一个 T 类型的对象中
            
            // 通过反射的方式创建泛型对象
            T t = tClass.newInstance();
            // 把每列数据放入到t中的同名属性
            for (int i = 1; i <= metaData.getColumnCount(); i++) { // 列的索引是基于1  select id as id1
                // 获取列名和列值
                String columnName = metaData.getColumnName(i);
                Object value = resultSet.getObject(i);
                BeanUtils.setProperty(t, columnName, value);  // t.age=10
            }
            
            result.add(t);
        }
        return result;
    }
    
    public static void main(String[] args) throws Exception {
//        Connection conn = getConnection(Constant.PHOENIX_DRIVER, Constant.PHOENIX_URL);
        Connection conn = getConnection("com.mysql.cj.jdbc.Driver", "jdbc:mysql://hadoop162:3306/gmall2021?user=root&password=aaaaaa");
//        List<JSONObject> list = queryList(conn, "select * from spu_info where id=?", new Object[]{"11"}, JSONObject.class);
        List<OrderInfo> list = queryList(conn, "select * from order_info", null, OrderInfo.class);
        for ( OrderInfo obj : list) {
            
            System.out.println(obj);
        }
    }
}
